package com.yf.exam.modules.user.book.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yf.exam.core.api.dto.PagingReqDTO;
import com.yf.exam.modules.user.book.dto.UserBookDTO;
import com.yf.exam.modules.user.book.entity.UserBook;

import java.util.List;

/**
* <p>
* 错题本业务类
* </p>
*
* @author 聪明笨狗
* @since 2020-05-27 17:56
*/
public interface UserBookService extends IService<UserBook> {

    /**
    * 分页查询数据（当前错题）
    * @param reqDTO
    * @return
    */
    IPage<UserBookDTO> paging(PagingReqDTO<UserBookDTO> reqDTO);
    
    /**
    * 分页查询历史错题
    * @param reqDTO
    * @return
    */
    IPage<UserBookDTO> pagingHistory(PagingReqDTO<UserBookDTO> reqDTO);

    /**
     * 加入错题本
     * @param quId
     * @param examId
     */
    void addBook(String examId, String quId);
    
    /**
     * 加入错题本（指定来源类型）
     * @param examId
     * @param quId
     * @param sourceType 来源类型：0-在线考试 1-公共题库
     */
    void addBookWithSource(String examId, String quId, Integer sourceType);

    /**
     * 查找第一个错题
     * @param quId
     * @param examId
     * @return
     */
    String findNext(String examId, String quId);
    
    /**
     * 根据来源类型分页查询
     * @param reqDTO
     * @param sourceType
     * @return
     */
    IPage<UserBookDTO> pagingBySource(PagingReqDTO<UserBookDTO> reqDTO, Integer sourceType);
    
    /**
     * 开始练习错题集
     * @param examId 考试ID
     * @param orderType 排序类型：0-顺序 1-逆序
     * @return 第一个错题ID
     */
    String startPractice(String examId, Integer orderType);
    
    /**
     * 获取下一个练习题目
     * @param examId 考试ID
     * @param currentQuId 当前题目ID
     * @param orderType 排序类型：0-顺序 1-逆序
     * @return 下一个题目ID
     */
    String getNextPracticeQu(String examId, String currentQuId, Integer orderType);
    
    /**
     * 提交练习答案
     * @param examId 考试ID
     * @param quId 题目ID
     * @param isCorrect 是否正确
     * @return 是否转为历史错题
     */
    Boolean submitPracticeAnswer(String examId, String quId, Boolean isCorrect);
    
    /**
     * 获取练习统计信息
     * @param examId 考试ID
     * @return 统计信息
     */
    Object getPracticeStats(String examId);
    
    /**
     * 删除当前用户的错题（带权限验证）
     * @param ids 错题ID列表
     * @return 是否删除成功
     */
    boolean deleteUserBooks(List<String> ids);
}
